//  这个文件会帮我们打包 packages 下的模块，最终打包出 js 文件

// node dev.js (要打包的名字 -f 打包的格式)

//  node 中通过 process.argv 来获取指令参数的

// pnpm install @vue/shared --workspace --filter @vue/reactivity
// 上面的指令表示将 shared 模块的代码按照 reactivity 模块中
// --workspace 表示当前的项目
// --filter 表示指定安装的模块

import minimist from "minimist";
import { createRequire } from "module";
import { resolve, dirname } from 'path'
import { fileURLToPath } from 'url'
import esbuild from 'esbuild'

// node 中 esm 模块没有 __dirname, module 模块没有 require
// esm 使用 commonjs 变量
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
// 创建 require 方法
const require = createRequire(import.meta.url)

// console.log(__filename, __dirname, '--->>>__filename, __dirname')

const agrs = minimist(process.argv.slice(2))

const target = agrs._[0] || 'reactivity' // 打包那个项目
const format = agrs.f || 'iife' // 打包后模块话规范 iife 立即执行函数

// console.log(target, format )

// 编译入口文件 根据命令行提供的路径来进行解析
const entry = resolve(__dirname, `../packages/${target}/src/index.ts`)
const pkg = require(`../packages/${target}/package.json`)

// 根据需要进行打包
esbuild.context({
    entryPoints: [entry], // 打包入口
    outfile: resolve(__dirname, `../packages/${target}/dist/${target}.js`), // 打包出口
    bundle: true, // 是否将依赖文件打包在一起 reactivity -> shared 会打包在一起
    platform: 'browser', // 打包之后运行的环境
    sourcemap: true, // 可以调式代码
    format, // cjs ems iife
    globalName: pkg.buildOptions?.name, // 如果是iife 需要返回名称,通过 package.json 中的 buildOptions 的 name 属性
}).then(ctx => {
    return ctx.watch() // 监控入口文件持续进行打包处理
})

